package persistencia.postgre;

import Exepciones.ExcepcionesSys.ExcepcionConexionErrorSys;
import persistencia.RegistroTraduccionDAO;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import persistencia.DAOFactory;

/**
 * Clase singleton, maneja operaciones especificas
 * de la base de datos Postgre
 */
public class PostgreDAOFactory extends DAOFactory {

    private static PostgreDAOFactory instancia;

    /**
     * @param driver o libreria de la base de datos
     * @param url de la base de datos
     * @param usuario de la base de datos
     * @param clave de la base de datos
     */
    protected PostgreDAOFactory(String driver, String url, String usuario, String clave) {
        super(driver, url, usuario, clave);
        idDB = "Postgres";
    }

    /**
     * Permite crear una instacia de Postrgres Factory
     * @param driver driver que permite la conexion a la base de datos
     * @param url url que representa la base de datos
     * @param usuario usuario de la base de datos
     * @param clave clave de la base de datos
     * @return PostgreDAOFactory
     */
    public static PostgreDAOFactory crear(String driver, String url, String usuario, String clave) {
        if (instancia == null) {
            instancia = new PostgreDAOFactory(driver, url, usuario, clave);
        }
        return instancia;
    }

    /**
     * El metodo a continuacion abre una determinada conexion para Postgres.
     * @return Connection de base de datos Postgres
     * @throws ExcepcionConexionErrorSys
     */
    public Connection getConexion() throws ExcepcionConexionErrorSys {
        try {
            Class.forName(DRIVER_DB);
            Connection conne = DriverManager.getConnection(URL_DB, USUARIO_DB, CLAVE_DB);
            return conne;
        } catch (SQLException ex) {
            throw new ExcepcionConexionErrorSys();
        } catch (ClassNotFoundException ex) {
            throw new ExcepcionConexionErrorSys();
        }
    }

    /**
     * El metodo a continuacion cierra una determinada conexion de Postgres.
     * @param conn a cerrar
     * @throws ExcepcionConexionErrorSys
     */
    public void cerrarConexion(Connection conn) throws ExcepcionConexionErrorSys {
        try {
            conn.close();
        } catch (SQLException ex) {
            throw new ExcepcionConexionErrorSys();
        }
    }

    @Override
    public RegistroTraduccionDAO getRegistroTraduccionDAO() throws ExcepcionConexionErrorSys {
        return new PostgreRegistroTraduccionDAO();
    }
}
